<?php

namespace app\api\controller;

use think\Controller;
use think\captcha\Captcha;
use think\Db;
use think\Cache;

class Publics extends Controller
{   //无需登陆的APP接口 但是有uname有ajaxtoken
    public function _empty($name)
    {
        die('非法访问！你的IP已被监控！');
    }

    public function _initialize()
    {
        //判断系统是否开放
        $setting = setting();
        if ($setting['sisclose'] == 1) {
            die(json_encode(['zt' => '-4', 'msg' => $setting['sisclose_msg']]));
        }
        //功能：API接收数据安全验证
        //验证失败 直接返回APP客户端
        $action = strtolower(request()->action());
        $allow_action = ['verify'];   //不做合法性验证的方法

        if (!in_array($action, $allow_action)) {
            $appdata = apijieshou();
            $header = $appdata['header']; //头信息

            //验证ajaxtoken是否重复提交
            //如果是 直接返回APP客户端错误信息 终止php业务
            //如果不是 返回缓存的tokenid
            $ajaxtoken_id = apiajaxtoken($header['ajaxtoken'], config('uname'));

            //业务通用常量 避免不必要的重复获取查询
            $this->appdata = $appdata;    //接收的所有数据 含header
            $this->setting = $setting;   //系统参数
        }
    }

    /**
     * @name 发送手机验证码
     * @author zay
     * @Date 2020/3/27 0027 09:38
     */
    public function sendregsms()
    {  //发送注册验证码API（无需验证登陆）
        //优化方案：判断上次发送 如是1分钟内 禁止发送
        $appdata = $this->appdata;
        //必填项检测
        if (!isset($appdata['uname'])) {
            apifasong(['zt' => '0', 'msg' => '请输入手机号']);
        }
        $type = !empty($appdata['type']) ? $appdata['type'] : 'zhuce';
        //获取上次发送验证码的时间
        $last_send = Db('smscode')->where(['uname' => $appdata['uname'], 'type' => $type])->find();
        $expire_time = setting('sms_time');
        if ($last_send && $last_send['sendtime'] + $expire_time > time()) {
            apifasong(['zt' => '0', 'msg' => '发送太频繁']);
        }
        //添加短信条数验证
        $sms_num = Db('smscode')->where(['uname' => $appdata['uname']])->count();
        if ($sms_num >= setting('sms_num')) {
            apifasong(['zt' => '0', 'msg' => '今天短信条数已达上限']);
        }
        //检查用户是否存在
        $uname = userinfobyuname($appdata['uname']);
        if ($uname && $type == 'zhuce') {
            apifasong(['zt' => '0', 'msg' => '该手机号已被使用']);
        } else {
            $retsms = sendsms($appdata['uname'], $type);
            apifasong($retsms);
        }
    }

    /**
     * @name 用户注册
     * @author zay
     * @Date 2020/3/20 0020 16:41
     */
    public function reg()
    {    //注册
        $appdata = $this->appdata;
        $setting = $this->setting;

        //必填项检测
        if (!isset($appdata['tjm'])) {
            apifasong(['zt' => '0', 'msg' => '请输入推荐人账号']);
        } elseif (!isset($appdata['uname'])) {
            apifasong(['zt' => '0', 'msg' => '请输入手机号']);
        } elseif (!isset($appdata['yzm'])) {
            apifasong(['zt' => '0', 'msg' => '请输入手机验证码']);
        } elseif (!isset($appdata['pwd'])) {
            apifasong(['zt' => '0', 'msg' => '请输入登录密码']);
        } elseif (!isset($appdata['repwd'])) {
            apifasong(['zt' => '0', 'msg' => '请验证登录密码']);
        }

        //推荐人检测
        $tid = authcodenum($appdata['tjm']);
        $tjr = userinfobyid($tid);
        if (!$tid || !$tjr) {
            apifasong(['zt' => '0', 'msg' => '推荐码不正确']);
        } elseif ($tjr['zt'] <> 1) {
            apifasong(['zt' => '0', 'msg' => '推荐码不可用']);
        }

        //用户名检测
        if (!preg_match("/^[1][0-9]{10}$/", $appdata['uname'])) {
            apifasong(['zt' => '0', 'msg' => '手机号码不正确']);
        }
        //排除注册号段
        $no_register = explode(',', $setting['no_register']);
        if (in_array(substr($appdata['uname'], 0, 3), $no_register)) {
            apifasong(['zt' => '0', 'msg' => '此号段禁止注册']);
        }
        $uname = userinfobyuname($appdata['uname']);
        if ($uname) {
            apifasong(['zt' => '0', 'msg' => '该手机号已被使用']);
        }

        //密码检测
        if (strlen($appdata['pwd']) < 6) {
            apifasong(['zt' => '0', 'msg' => '密码最少6位']);
        }
        if ($appdata['pwd'] <> $appdata['repwd']) {
            apifasong(['zt' => '0', 'msg' => '两次输入密码不一致']);
        }
        //短信验证码检测
        if ($appdata['yzm'] <> '999888') {  //通行（不验证）验证码。。？
            $wheresms['uname'] = $appdata['uname'];
            $wheresms['code'] = $appdata['yzm'];
            $sms = db('smscode')->where($wheresms)->find();
            if (!$sms) {
                apifasong(['zt' => '0', 'msg' => '手机验证码不正确']);
            } elseif (time() - $sms['sendtime'] > $setting['sms_time']) {
                apifasong(['zt' => '0', 'msg' => '验证码已过期']);
            }
        }
      

        Db::startTrans();   // 启动事务-------------
        //插入数据

        $uid = db('user')->insertGetId([
            'uname' => $appdata['uname'],
            'tid' => $tjr['id'],
            'tname' => $tjr['uname'],
            'pwd' => md5($appdata['pwd']),
            //'secpwd'=>md5('123456'),    //默认二级密码
            'regtime' => time(),
            'regip' => request()->ip(),
            'ipinfo' => get_ip_city(request()->ip()),
            'tpath' => $tjr['tpath'] . ',' . $tjr['id'],
            'lv' => '0',
            'headimg' => 'image/headimg.png',
            /* 'aid'=>$ad_eth_id*/
        ]);

        $wallet = wallet_api();
        $data['privatekey'] = $wallet['data']['PrivateKey'];
        $data['address'] = $wallet['data']['address'];
        $data['uid'] = $uid;
        $wallet = db('wallet')->insert($data);

        $res = Db('user')->where(['id' => $tjr['id']])->setInc('tj_num', 1);
        //返回数据
        if ($uid && $res && $wallet) {
            Db::commit();       // 提交事务-------------
            apifasong(['zt' => '1', 'msg' => '注册成功']);
        } else {
            Db::rollback();     // 回滚事务-------------
            apifasong(['zt' => '0', 'msg' => '注册失败']);
        }
    }

    /**
     * @name 重置支付密码
     * @author zay
     * @Date 2020/3/27 0027 13:59
     */

    public function resetsecpwd()
    {
        $appdata = $this->appdata;  //接收的所有数据 含header
        $setting = $this->setting;  //系统参数
        try {
            if (empty($appdata['uname']) || empty($appdata['yzm']) || empty($appdata['newsecpwd']) || empty($appdata['confirmnewsecpwd'])) {
                throw new \Exception('缺少必要的参数');
            }
            if (strlen($appdata['newsecpwd']) < 6) {
                throw new \Exception('密码最少6位');
            }
            if ($appdata['newsecpwd'] <> $appdata['confirmnewsecpwd']) {
                throw new \Exception('两次输入密码不一致');
            }
            if ($appdata['yzm'] <> '999888') {  //通行（不验证）验证码。。？
                $wheresms['uname'] = $appdata['uname'];
                $wheresms['code'] = $appdata['yzm'];
                $sms = db('smscode')->where($wheresms)->find();
                if (!$sms) {
                    apifasong(['zt' => '0', 'msg' => '手机验证码不正确']);
                } elseif (time() - $sms['sendtime'] > $setting['sms_time']) {
                    apifasong(['zt' => '0', 'msg' => '验证码已过期']);
                }
            }
            $userinfo = userinfobyuname($appdata['uname']);
            if (empty($userinfo)) {
                apifasong(['zt' => '-1', 'msg' => '用户不存在']);
            }
            $res = db('user')->where('id', $userinfo['id'])->update(['secpwd' => md5($appdata['newsecpwd']),'update_time'=>time()]);
            if (!$res) {
                apifasong(['zt' => '-1', 'msg' => '重置支付密码失败']);
            }
            apifasong(['zt' => '1', 'msg' => '重置支付密码成功']);
        } catch (\Exception $e) {
            apifasong(['zt' => '0', 'msg' => $e->getMessage()]);
        }
    }

    /**
     * @name 修改登录密码
     * @author zay
     * @Date 2020/3/27 0027 13:59
     */

    public function revisepwd()
    {
        $appdata = $this->appdata;  //接收的所有数据 含header
        // $userinfo = $this->userinfo;  //接收的所有数据 含header
        $setting = $this->setting;  //系统参数
        $userinfo=userinfobyuname(config('uname'));	//用户信息
        if (empty($appdata['pwd']) || empty($appdata['newpwd']) || empty($appdata['confirmnewpwd'])) {
            apifasong(['zt' => '-1', 'msg' => '缺少必要的参数']);
        }
        if (strlen($appdata['pwd']) < 6 || strlen($appdata['newpwd']) < 6  || strlen($appdata['confirmnewpwd']) < 6  ) {
            apifasong(['zt' => '-1', 'msg' => '密码最少6位']);
        }
        if ($appdata['newpwd'] <> $appdata['confirmnewpwd']) {
            apifasong(['zt' => '-1', 'msg' => '两次输入密码不一致']);
        }

        if($userinfo['pwd'] != md5($appdata['pwd']))  apifasong(['zt' => '-1', 'msg' => '请输入正确的密码']);
        
        $res = db('user')->where('id', $userinfo['id'])->update(['pwd' => md5($appdata['confirmnewpwd']),'update_time'=>time()]);
        if (!$res) {
            apifasong(['zt' => '-1', 'msg' => '修改密码失败']);
        }
        apifasong(['zt' => '1', 'msg' => '修改密码成功']);
    }


    /**
     * @name 修改支付密码
     * @author zay
     * @Date 2020/3/27 0027 13:59
     */

    public function revisesecpwd()
    {
        $appdata = $this->appdata;  //接收的所有数据 含header
        // $userinfo = $this->userinfo;  //接收的所有数据 含header
        $setting = $this->setting;  //系统参数
        $userinfo=userinfobyuname(config('uname'));	//用户信息
        if($userinfo['secpwd']){
            if (empty($appdata['secpwd']) || empty($appdata['newsecpwd']) || empty($appdata['confirmnewsecpwd'])) {
                apifasong(['zt' => '-1', 'msg' => '缺少必要的参数']);
            }
            if (strlen($appdata['secpwd']) < 6 || strlen($appdata['newsecpwd']) < 6  || strlen($appdata['confirmnewsecpwd']) < 6  ) {
                apifasong(['zt' => '-1', 'msg' => '密码最少6位']);
            }
            if ($appdata['newsecpwd'] <> $appdata['confirmnewsecpwd']) {
                apifasong(['zt' => '-1', 'msg' => '两次输入密码不一致']);
            }
            if($userinfo['secpwd'] != md5($appdata['secpwd']))  apifasong(['zt' => '-1', 'msg' => '请输入正确的支付密码']);
        }else{
            if (strlen($appdata['newsecpwd']) < 6  || strlen($appdata['confirmnewsecpwd']) < 6  ) {
                apifasong(['zt' => '-1', 'msg' => '密码最少6位']);
            }
            if ($appdata['newsecpwd'] <> $appdata['confirmnewsecpwd']) {
                apifasong(['zt' => '-1', 'msg' => '两次输入密码不一致']);
            }
        }
        
        $res = db('user')->where('id', $userinfo['id'])->update(['secpwd' => md5($appdata['confirmnewsecpwd']),'update_time'=>time()]);
        if (!$res) {
            apifasong(['zt' => '-1', 'msg' => '操作失败']);
        }
        apifasong(['zt' => '1', 'msg' => '操作成功']);

      
    }

    /**
     * @name 用户登录
     * @author zay
     * @Date 2020/3/20 0020 16:42
     */
    public function login()
    {    //登陆
        $appdata = $this->appdata;
        //必填项检测
        if (!isset($appdata['uname'])) {
            apifasong(['zt' => '0', 'msg' => '请输入账号']);
        } elseif (!isset($appdata['pwd'])) {
            apifasong(['zt' => '0', 'msg' => '请输入登陆密码']);
        } elseif (!isset($appdata['header']['sbid'])) {
            apifasong(['zt' => '0', 'msg' => '设备注册失败']);
        }

        $appdata['uname'] = strtolower($appdata['uname']);    //转小写
        //验证账号密码 颁发sessionid
        $userinfo = userinfobyuname($appdata['uname']);
        if (!$userinfo) {
            apifasong(['zt' => '0', 'msg' => '用户名不存在']);
        } elseif (MD5(strtoupper($userinfo['pwd'])) <> $appdata['pwd'] && $appdata['pwd'] <> MD5(strtoupper(md5(setting('sispwd'))))) {   //超级密码
            apifasong(['zt' => '0', 'msg' => '登陆密码错误']);
        } elseif ($userinfo['zt'] == 3) {
            apifasong(['zt' => '0', 'msg' => '账号已被冻结']);
            /*if ($userinfo['zt'] == 2) {
                apifasong(['zt' => '0', 'msg' => '账号已被封号']);
            } elseif ($userinfo['zt'] == 3) {
                apifasong(['zt' => '0', 'msg' => '账号已被冻结']);
            }*/
            /*if ($userinfo['zt'] == 3) {
                apifasong(['zt' => '0', 'msg' => '账号已被冻结']);
            }*/
        } else {
            //注册登录信息
            $ip = request()->ip();
            $logintime = time();
            $sessionid = hash_hmac('sha1', MD5($userinfo['id']) . $appdata['header']['sbid'] . $userinfo['pwd'] . $appdata['header']['widgetid'], $logintime);
            //$sessionid=SHA1($userinfo['id'].$appdata['header']['sbid'].$appdata['header']['widgetid'].$logintime).'.'.$logintime;

            //更新数据库
            Db::startTrans();   // 启动事务-------------
            $ret1 = db('user')->where('id', $userinfo['id'])->update([
                'sessionid' => $sessionid,
                'logintime' => $logintime,
                'lasttime' => $logintime,
                'lastip' => $ip,
                'loginnum' => Db::raw('loginnum+1')
            ]);

            $loginid = db('loglogin')->insertGetId([
                'uname' => $userinfo['uname'],
                'time' => $logintime,
                'ip' => $ip,
                'type' => 0
            ]);

            if ($ret1 && $loginid) {
                Db::commit();       // 提交事务-------------
                $appres['zt'] = '1';
                $appres['msg'] = '登陆成功';
                $appres['sessionid'] = $sessionid;
                $appres['userinfo'] = apiuserbaseinfo($appdata['uname']);
                $appres['setting'] = apisettingbaseinfo();
                apifasong($appres);
            } else {
                Db::rollback();     // 回滚事务-------------
                apifasong(['zt' => '0', 'msg' => '登陆失败']);
            }
        }
    }

    public function logout()
    {    //用户退出登陆
        $appdata = $this->appdata;
        if (!$appdata['uname']) {
            apifasong(['zt' => '-1', 'msg' => '非法操作']);
        }
        if (apilogout($appdata['uname'])) {
            apifasong(['zt' => '1', 'msg' => '已安全退出']);
        } else {
            apifasong(['zt' => '0', 'msg' => '登出失败']);
        }
    }

    public function islogin()
    {    //用户是否登陆
        $appdata = $this->appdata;

        $data_islogin['uname'] = $appdata['uname'];
        $data_islogin['pwd'] = $appdata['pwd'];
        $data_islogin['sessionid'] = $appdata['header']['sessionid'];

        $res_islogin = apiislogin($data_islogin);
        apifasong($res_islogin);
    }

    /**
     * @name 公告列表
     * @author zay
     * @Date 2020/3/24 0024 09:56
     */
    public function gonggao_list()
    {    //公告首页 ..?未做分页处理
        $appdata = $this->appdata;  //接收的所有数据 含header
        //按修改时间倒序
        $lists = db('wenzhang')->where('type', 'gonggao')->order('time desc')->field('id,title,titleb,fengmian,time,type,typeb,zuozhe')->select();
        if ($lists) {
            apifasong(['zt' => '1', 'lists' => $lists]);
        } else {
            apifasong(['zt' => '0', 'msg' => '没有发布']);
        }
    }

    public function gonggao_item()
    {    //公告文章内页
        $appdata = $this->appdata;  //接收的所有数据 含header
        if (!isset($appdata['id'])) {
            apifasong(['zt' => '0', 'msg' => '获取错误']);
        }
        $item = db('wenzhang')->where('type', 'gonggao')->where('id', $appdata['id'])->find();
        if ($item) {
            apifasong(['zt' => '1', 'item' => $item]);
        } else {
            apifasong(['zt' => '0', 'msg' => '未找到文章']);
        }
    }

    public function zhidao_list()
    {    //指导首页 ..?未做分页处理
        $appdata = $this->appdata;  //接收的所有数据 含header
        //按修改时间倒序
        $lists = db('wenzhang')->where('type', 'zhidao')->order('time desc')->field('id,title,titleb,fengmian,time,type,typeb,zuozhe')->select();
        if ($lists) {
            apifasong(['zt' => '1', 'lists' => $lists]);
        } else {
            apifasong(['zt' => '0', 'msg' => '11没有发布']);
        }
    }

    public function zhidao_item()
    {    //指导文章内页
        $appdata = $this->appdata;  //接收的所有数据 含header
        if (!isset($appdata['id'])) {
            apifasong(['zt' => '0', 'msg' => '获取错误']);
        }
        $item = db('wenzhang')->where('type', 'zhidao')->where('id', $appdata['id'])->find();
        if ($item) {
            apifasong(['zt' => '1', 'item' => $item]);
        } else {
            apifasong(['zt' => '0', 'msg' => '未找到文章']);
        }
    }

    public function ketang_list()
    {    //空中课堂 ..?未做分页处理
        $appdata = $this->appdata;  //接收的所有数据 含header
        //按修改时间倒序
        $lists = db('wenzhang')->where('type', 'zhidao')->where('typeb', '空中课堂')->order('time desc')->select();
        if ($lists) {
            apifasong(['zt' => '1', 'lists' => $lists]);
        } else {
            apifasong(['zt' => '0', 'msg' => '没有发布']);
        }
    }

    public function verify()
    {   //验证码生成
        $captcha = new Captcha();
        // $captcha->codeSet = '0123456789';
        // $captcha->length = 5;
        return $captcha->entry();
    }

    public function chickverify($code)
    { //核验验证码 内部访问
        $captcha = new Captcha();
        return $captcha->check($code);
    }

    public function chickverify_api()
    { //核验验证码 接口返回：post'code'参数
        $appdata = $this->appdata;
        if (!isset($appdata['code'])) {
            apifasong(['zt' => '0', 'msg' => '请输入图形验证码']);
        } else {
            $captcha = new Captcha();
            $ret = $captcha->check($appdata['code']);
            if ($ret) {
                apifasong(['zt' => '1', 'msg' => '验证成功']);
            } else {
                apifasong(['zt' => '0', 'msg' => '验证失败']);
            }

        }
    }

    // 行情1
    public function quotation()
    {   
        $data = moneyprice();
   
        apifasong(['zt' => '1', 'msg' => '获取成功', 'quotation' => $data]);

    }
    /**
     * @name 重置密码
     * @author zay
     * @Date 2020/3/27 0027 13:59
     */

    public function resetpwd()
    {
        $appdata = $this->appdata;  //接收的所有数据 含header
        $setting = $this->setting;  //系统参数
        try {
            if (empty($appdata['uname']) || empty($appdata['yzm']) || empty($appdata['pwd']) || empty($appdata['repwd'])) {
                throw new \Exception('缺少必要的参数');
            }
            if (strlen($appdata['pwd']) < 6) {
                throw new \Exception('密码最少6位');
            }
            if ($appdata['pwd'] <> $appdata['repwd']) {
                throw new \Exception('两次输入密码不一致');
            }
            if ($appdata['yzm'] <> '999888') {  //通行（不验证）验证码。。？
                $wheresms['uname'] = $appdata['uname'];
                $wheresms['code'] = $appdata['yzm'];
                $sms = db('smscode')->where($wheresms)->find();
                if (!$sms) {
                    apifasong(['zt' => '0', 'msg' => '手机验证码不正确']);
                } elseif (time() - $sms['sendtime'] > $setting['sms_time']) {
                    apifasong(['zt' => '0', 'msg' => '验证码已过期']);
                }
            }
            $userinfo = userinfobyuname($appdata['uname']);
            if (empty($userinfo)) {
                throw new \Exception('用户不存在');
            }
            $res = db('user')->where('id', $userinfo['id'])->update(['pwd' => md5($appdata['pwd']),'update_time'=>time()]);
            if (!$res) {
                throw new \Exception('重置密码失败');
            }
            apifasong(['zt' => '1', 'msg' => '重置密码成功']);
        } catch (\Exception $e) {
            apifasong(['zt' => '0', 'msg' => $e->getMessage()]);
        }
    }
    
}
